#include "sqlite.hpp"  // 包含SQLite数据库操作封装头文件
#include <cassert>     // 用于断言检查操作结果

/**
 * SELECT查询的回调函数，用于处理每一行查询结果
 * @param arg 用户传递的参数，本例中为存储结果的vector指针
 * @param col_count 结果集的列数
 * @param result 每列的数据值（字符串数组）
 * @param fields_name 每列的字段名（字符串数组）
 * @return 必须返回0，表示继续处理后续行（非0值会中断查询）
 */
int select_stu_callback(void* arg, int col_count, char** result, char** fields_name) {
    // 将用户参数转换为vector指针
    std::vector<std::string> *arry = (std::vector<std::string>*)arg;
    
    // 将查询结果的第一列（姓名）添加到vector中
    arry->push_back(result[0]);
    
    // 必须返回0以继续处理后续行！
    return 0;
}

int main()
{
    // 创建SQLite数据库助手对象，指定数据库文件路径
    SqliteHelper helper("./test.db");
    
    // 1. 创建/打开数据库文件
    // 使用assert确保操作成功，失败则终止程序
    assert(helper.open());
    
    // 2. 创建表（如果不存在）
    // 表结构：学生信息表，包含学号（主键）、姓名、年龄
    const char *ct = "create table if not exists student(sn int primary key, name varchar(32), age int);";
    assert(helper.exec(ct, nullptr, nullptr));
    
    // 3. 数据库操作示例（已注释，可取消注释测试）
    // 插入数据示例
    const char *insert_sql = "insert into student values(1, '小明', 18), (2, '小黑', 19), (3, '小红', 18);";
    assert(helper.exec(insert_sql, nullptr, nullptr));
    
    // 更新数据示例
    const char *update_sql = "update student set name='张小明' where sn=1";
    assert(helper.exec(update_sql, nullptr, nullptr));
    
    // 删除数据示例
    // const char *delete_sql = "delete from student where sn=3";
    // assert(helper.exec(delete_sql, nullptr, nullptr));
    
    // 查询数据：获取所有学生的姓名
    const char *select_sql = "select name from student;";
    std::vector<std::string> arry;
    
    // 执行查询，并通过回调函数将结果存入vector
    assert(helper.exec(select_sql, select_stu_callback, &arry));
    
    // 输出查询结果
    for (auto &name : arry) {
        std::cout << name << std::endl;
    }
    
    // 4. 关闭数据库连接
    helper.close();
    
    return 0;
}    